
#include "ElementoCircuital.h"

ElementoCircuital:: ElementoCircuital(int x, int y, int ID){
	id=ID;
	this->posicion_x = x;
	this->posicion_y = y;
	this->angulo = 0;
	this->seleccionado = false;
}

void ElementoCircuital::agregar_conexion(Conexion* nueva_conexion, int nro_salida){
	L_conexiones.push_back(nueva_conexion);
}

void ElementoCircuital:: liberar_conexiones(){
	std::list<Conexion*>::iterator lit(L_conexiones.begin());
	std::list<Conexion*>::const_iterator lend(L_conexiones.end());
	if(L_conexiones.empty()){
		return ;
	}
	else{
		while(lit!=lend){
			((*lit)->get_receptor())->desconectar_entrada((*lit)->get_nro_entrada());
			delete *lit;
			lit++;
		}
		L_conexiones.clear();
	}
}

void ElementoCircuital::cortar_cable(int id_cable){
	std::list<Conexion*>::iterator lit(L_conexiones.begin());
	std::list<Conexion*>::const_iterator lend(L_conexiones.end());
	if(L_conexiones.empty())
		return ;
	else{
		bool encontrado=false;
		while((lit!=lend)&&(!encontrado)){
			if((*lit)->get_id()==id_cable){
				((*lit)->get_receptor())->desconectar_entrada((*lit)->get_nro_entrada());
				encontrado=true;
			}
			else
				lit++;
		}
		delete *lit;
		L_conexiones.erase(lit);
	}
}


void ElementoCircuital::rotar(){
	angulo += ROTACION;
	if (angulo == 360)
		angulo = 0;
}

int ElementoCircuital::get_nro_entrada(int x,int y){
	int nro_entrada = 1;
	if ((get_tipo()!=4)&&(get_tipo()!=2)){
		if (get_angulo()==0){
			if ( y > posicion_y + TAMANIO/2){
				nro_entrada = 2;
			}
		}
		if (get_angulo()==90){
			if ( x < posicion_x + TAMANIO/2){
				nro_entrada = 2;
			}
		}
		if (get_angulo()==180){
			if ( y < posicion_y + TAMANIO/2){
				nro_entrada = 2;
			}
		}
		if (get_angulo()==270){
			if ( x > posicion_x + TAMANIO/2){
				nro_entrada = 2;
			}
		}
	}
	return nro_entrada;
}

int ElementoCircuital::get_pos_entrada1_x(){
	if ((tipo == TIPO_NOT)||(tipo == TIPO_SALIDA)){
		if (angulo == 0){
			return get_posicion_x() + 3;
		}
		if (angulo == 90){
			return get_posicion_x() + TAMANIO/2;
		}
		if (angulo == 180){
			return get_posicion_x() + TAMANIO - 3;
		}
		if (angulo == 270){
			return get_posicion_x() + TAMANIO/2;
		}
	}
	else {
		if (angulo == 0){
			return get_posicion_x() + 3;
		}
		if (angulo == 90){
			return get_posicion_x() + 3*TAMANIO/4;
		}
		if (angulo == 180){
			return get_posicion_x() + TAMANIO - 3;
		}
		if (angulo == 270){
			return get_posicion_x() + TAMANIO/4;
		}
	}
	return 0;
}


int ElementoCircuital::get_pos_entrada1_y(){
	if ((tipo == TIPO_NOT)||(tipo == TIPO_SALIDA)){
		if (angulo == 0){
			return get_posicion_y() +TAMANIO/2;
		}
		if (angulo == 90){
			return get_posicion_y() + 3;
		}
		if (angulo == 180){
			return get_posicion_y() + TAMANIO/2;
		}
		if (angulo == 270){
			return get_posicion_y() + TAMANIO - 3;
		}
	}
	else {
		if (angulo == 0){
			return get_posicion_y() + TAMANIO/4;
		}
		if (angulo == 90){
			return get_posicion_y() + 3;
		}
		if (angulo == 180){
			return get_posicion_y() + 3*TAMANIO/4;
		}
		if (angulo == 270){
			return get_posicion_y() + TAMANIO - 3;
		}
	}
	return 0;
}


int ElementoCircuital::get_pos_entrada2_x(){
	if (angulo == 0){
		return get_posicion_x() + 3;
	}
	if (angulo == 90){
		return get_posicion_x() + TAMANIO/4;
	}
	if (angulo == 180){
		return get_posicion_x() + TAMANIO - 3;
	}
	if (angulo == 270){
		return get_posicion_x() + 3*TAMANIO/4;
	}
	else
		return 0;
}


int ElementoCircuital::get_pos_entrada2_y(){
	if (angulo == 0){
		return get_posicion_y() + 3*TAMANIO/4;
	}
	if (angulo == 90){
		return get_posicion_y() + 3;
	}
	if (angulo == 180){
		return get_posicion_y() + TAMANIO/4;
	}
	if (angulo == 270){
		return get_posicion_y() + TAMANIO - 3;
	}
	else
		return 0;
}


int ElementoCircuital::get_posicion_salida_x(){
	if (angulo == 0){
		return get_posicion_x() + TAMANIO - 3;
	}
	if (angulo == 90){
		return get_posicion_x() + TAMANIO/2;
	}
	if (angulo == 180){
		return get_posicion_x() + 3;
	}
	if (angulo == 270){
		return get_posicion_x() + TAMANIO/2;
	}
	else return 0;
}

int ElementoCircuital::get_posicion_salida_y(){
	if (angulo == 0){
		return get_posicion_y() + TAMANIO/2;
	}
	if (angulo == 90){
		return get_posicion_y() + TAMANIO -3;
	}
	if (angulo == 180){
		return get_posicion_y() + TAMANIO/2;
	}
	if (angulo == 270){
		return get_posicion_y() + 3;
	}
	else return 0;
}



void ElementoCircuital::set_posicionX_rel(int x_inicial, int x_final){
	int auxiliar = x_final - x_inicial;
	this->posicion_x += auxiliar;
}

void ElementoCircuital::set_posicionY_rel(int y_inicial, int y_final){
	int auxiliar = y_final - y_inicial;
	this->posicion_y += auxiliar;
}
